NAS-127825 / 24.10.1 / Fix inconsistent mount options for ZFS root #258
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation and Context
Backport of openzfs#16646 for TrueNAS ZFS.
Description
While mounting ZFS root during boot on Linux distributions from initrd, mount from busybox is effectively used which executes
mount
system call directly. This skips the ZFS helpermount.zfs
, which checks and enables the mount options as specified in dataset properties. As a result, datasets mounted during boot from initrd do not have correct mount options as specified in ZFS dataset properties.There has been an attempt to use
mount.zfs
in zfs initrd script, responsible for mounting the ZFS root filesystem (PR#13305). This was later reverted (PR#14908) after discovering that using mount.zfs breaks mounting of snapshots on root (/
) and child datasets of root have the same issue (Issue#9461).This happens because switching from busybox mount to mount.zfs correctly parses the mount options but also adds
mntpoint=/root
to the mount options, which is then prepended to the snapshot mountpoint in.zfs/snapshot
./root
is the directory on Debian withinitramfs-tools
where root filesystem is mounted beforepivot_root
. When Linux runtime is reached, trying to access the snapshots on root results in automounting the snapshot on/root/.zfs/*
, which fails.This commit attempts to fix the automounting of snapshots on root, while using
mount.zfs
in initrd script. Since the mountpoint of dataset is stored invfs_mntpoint
field, we can check if current mountpoint of dataset andvfs_mntpoint
are same or not. If they are not same, reset thevfs_mntpoint
field with current mountpoint. This fixes the mountpoints of root dataset and children in respectivevfs_mntpoint
fields when we try to access the snapshots of root dataset or its children. With correct mountpoint for root dataset and children stored invfs_mntpoint
, all snapshots of root dataset are mounted correctly and become accessible.This fix will come into play only if current process, that is trying to access the snapshots is not in chroot context. The Linux kernel API that is used to convert struct path into char format (
d_path
), returns the complete path for givenstruct path
. It works in chroot environment as well and returns the correct path from original filesystem root.However,
d_path
fails to return the complete path if any directory from original root filesystem is mounted using--bind
flag or--rbind
flag in chroot environment. In this case, if we try to access the snapshot from outside the chroot environment,d_path
returns the path correctly, i.e. it returns the correct path to the directory that is mounted with--bind
flag. However inside the chroot environment, it only returns the path inside chroot.For now, there is not a better way in my understanding that gives the complete path in char format and handles the case where directories from root filesystem are mounted with
--bind
or--rbind
on another path which user will later chroot into. So this fix gets enabled if current process trying to access the snapshot is not in chroot context.With the snapshots issue fixed for root filesystem, using
mount.zfs
in ZFS initrd script, mounts the datasets with correct mount options.How Has This Been Tested?
/
while usingmount.zfs
to mount ZFS root during boot.--bind/--rbind
case)Types of changes
Checklist:
Signed-off-by
.